package crypto;

import java.security.Provider;
import java.security.Security;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class JCAtest {
    public static void main(String[] args) {

        Provider[] arr = Security.getProviders();

        //打印出Security中所有的提供者（包括每个提供者的名字、版本、详情）
        for (int i = 0; i < arr.length; i++) {
            System.out.println("名字：" + arr[i].getName() + "\n版本：" + arr[i].getVersion() + "\n详情：" + arr[i].getInfo() + "\n");
        }

        //返回此 Provider 中所包含的属性名字和对应的值
        for (int i = 0; i < arr.length; i++) {
            Set keys = arr[i].keySet();
            for (Iterator it = keys.iterator(); it.hasNext(); ) {
                String key = (String)it.next();
                // 每个keys的属性项可能由一个字符串组成，或是有一个空格分隔的字符串组成，带空格的字符串有两种情况（命名：空格前为属性项，空格后为属性名）
                // 1、相同属性项下的不同属性名（如：“Provider.id name” 和 “Provider.id version”）
                // 2、不同属性项下的相同属性名（如：“TransformService.http://www.w3.org/2001/10/xml-exc-c14n# MechanismType” 和 “TransformService.http://www.w3.org/TR/1999/REC-xpath-19991116 MechanismType”）
                key = key.split(" ")[0];
                System.out.println("key : " + key + "\nvalue:" + arr[i].get(key) + "\n");
            }
        }

        //
        String[] ss = getCryptoImpls("RSA");
        for(String i : ss){
            System.out.println(i);
        }
    }

    public static String[] getCryptoImpls(String serviceType) {
        Set result = new HashSet();

        // 得到所有提供者
        Provider[] providers = Security.getProviders();
        for (int i=0; i<providers.length; i++) {
            // 获得每个提供者提供的服务
            Set keys = providers[i].keySet();
            // 遍历keys
            for (Iterator it=keys.iterator(); it.hasNext(); ) {
                String key = (String)it.next();
                key = key.split(" ")[0];
                // 找到我们想要的算法，并将想要的算法的名字择出来
                if (key.startsWith(serviceType+".")) {
                    result.add(key.substring(serviceType.length()+1));
                } else if (key.startsWith("Alg.Alias."+serviceType+".")) {
                    // This is an alias
                    result.add(key.substring(serviceType.length()+11));
                }
            }
        }
        return (String[])result.toArray(new String[result.size()]);
    }
}
